package com.atguigu.core.enumcode;

import com.atguigu.core.exception.ErrorCode;
import org.apache.commons.lang3.StringUtils;

/**
 * 业务错误码
 *
 * @author Navi
 */
public enum BizResultCodeEnum implements ErrorCode {

  /**
   * 系统消息
   */
  OK("200", "处理正常"),
  EXISTS("201", "数据已上传,请不要重复操作！"),
  UNSPECIFIED("X000", "网络异常"),
  UNKNOW_ERROR("X001", "系统或网络异常"),
  SYS_ERROR("X002", "系统内部错误 - {}"),
  SYS_INVALID_REQUEST_PATH("SE001", "无效请求路径 - {}"),
  SYS_ERR_INVALID_SERIAL_TYPE("SE201", "无效采番日期格式 - {} "),
  /**
   * 泛用操作异常
   */
  /**
   * 乐观锁异常
   */
  SYS_ERR_OPTIMISTIC_LOCK("SE002", "数据已被更新 || 提交Version:{} - 目标数据:{}"),
  SYS_ERR_DELETE("SE003", "数据删除失败 || 目标数据:{}"),
  SYS_ERR_HOSTS_NAME("SE004", "HOSTNAME不存在 - {}"),
  SYS_ERR_NO_PROCESS_HANDLER("SE005", "MQ受信业务定义不存在 - {}"),
  SYS_ERR_INVALID_DATASOURCE("SE006", "数据源异常 - {} "),
  SYS_ERR_INVALID_QUERY_KEY("SE007", "查询字段不存在 - {} "),
  SYS_ERR_FAILURE_LOCK("SE008", "数据已被锁定 - {}"),
  SYS_ERR_ESB_FAILURE_CALL("SE009", "Esb Rest 调用失败: URL -> {} ### REQ -> {} ### RES -> {}"),
  TOPIC_ERR_PROCESS_OVER_TIME("SE010", "Topic 超期未处理"),
  SYS_ERR_INVALID_TRANSLATE_KEY("SE011", "无效转换项目 - {} "),
  /**
   * 工具异常
   */
  MSG_UNZIP("UE001", "Gzip参数无法解压缩"),
  /**
   * MQ 处理异常
   */
  MQ_ERR_SYS_ERROR_FLAG("999", "系统异常"),
  MQ_ERR_E100("E100", "锁表,待重投"),

  /**
   * WS 处理异常
   */
  WS_ERR_ER010("ER010", "正在接收DMS订单,待重投"),

  /**
   * WS 处理异常
   */
  WS_ERR_ER011("ER011", "特约店零件库存上传,待重投"),

  /**
   * Workflow 处理异常
   */
  WF_ERR_E100("WF100", "没有找到当前审批任务ID:{}"),
  /**
   * Workflow 处理异常
   */
  WF_ERR_E101("WF101", "没有找到当前审批任务ID:{}中的审批人"),
  /**
   * Workflow 处理异常
   */
  WF_ERR_E102("WF102", "没有找到下一节点审批人。任务ID:{}"),
  /**
   * Common 属性长度验证超长返回信息
   */
  COMMON_ERR_E001("CM001", "{} - 有效部分:{}"),
  /**
   * 特约店库存基准计算
   */
  JOB_ISPD_ERR_E001("ISPD001", "特约店基准数据脚本执行异常 ==> {}"),

  /**
   * 自定义库存基准计算
   */
  JOB_ISPD_ERR_E002("ISPD002", "自定义库存基准数据脚本执行异常"),;
  /**
   * 错误码
   */
  private final String code;

  /**
   * 描述
   */
  private final String description;

  /**
   * @param code        错误码
   * @param description 描述
   */
  private BizResultCodeEnum(final String code, final String description) {
    this.code = code;
    this.description = description;
  }

  /**
   * 根据编码查询枚举。
   *
   * @param code 编码。
   * @return 枚举。
   */
  public static BizResultCodeEnum getByCode(String code) {
    for (BizResultCodeEnum value : BizResultCodeEnum.values()) {
      if (StringUtils.equals(code, value.getCode())) {
        return value;
      }
    }
    return UNSPECIFIED;
  }

  /**
   * 枚举是否包含此code
   *
   * @param code 枚举code
   * @return 结果
   */
  public static Boolean contains(String code) {
    for (BizResultCodeEnum value : BizResultCodeEnum.values()) {
      if (StringUtils.equals(code, value.getCode())) {
        return true;
      }
    }
    return false;
  }

  @Override
  public String getCode() {
    return code;
  }

  @Override
  public String getDescription() {
    return description;
  }
}
